Debugging computer software can be a particularly challenging endeavor. Software defects (“bugs”) are notoriously difficult to locate and analyze. One common way to locate bugs is to generate a trace of program execution. In such an approach, processor state and the values of memory locations are recorded after each single step of a program. A programmer can then consult the trace of the program's execution to see if the program is executing as expected.
However, such a conventional approach breaks down if the program is particularly complex or if the program runs for any significant length of time. The pure volume of data generated by such a trace can quickly overwhelm the bandwidth and storage capacity of even advanced computer systems.